#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <math.h>
#include <linux/input.h>
#include <iostream>
using namespace std;


class TS {
private:
    int fd_touch;
    int x;
    int y;
    bool is_open;

public:
    // 构造函数
    TS() : fd_touch(-1), x(-1), y(-1), is_open(false) {}
    
    // 析构函数
    ~TS() {
        closeDevice();
    }
    
    // 打开触摸屏设备
    bool openDevice(const char* device_path = "/dev/input/event0") {
        fd_touch = open(device_path, O_RDWR);
        if (fd_touch < 0) {
            printf("open error %s\n", strerror(errno));
            is_open = false;
            return false;
        }
        printf("open success\n");
        is_open = true;
        return true;
    }
    
    // 关闭触摸屏设备
    void closeDevice() {
        if (is_open) {
            close(fd_touch);
            is_open = false;
            printf("device closed\n");
        }
    }
    
    // 读取单次触摸事件
    bool readEvent() {
        if (!is_open) {
            printf("device not opened\n");
            return false;
        }
        
        struct input_event buf;
        memset(&buf, 0, sizeof(buf));
        
        ssize_t result = read(fd_touch, &buf, sizeof(buf));
        if (result < 0) {
            printf("read error %s\n", strerror(errno));
            return false;
        }
        
        if (buf.type == EV_ABS) {
            if (buf.code == ABS_X) {
                x = buf.value;
            }
            if (buf.code == ABS_Y) {
                y = buf.value;
            }
        }
        
        // 返回true表示有同步事件（坐标数据完整）
        return (buf.type == EV_SYN);
    }
    
    // 获取当前X坐标
    int getX() const {
        return x;
    }
    
    // 获取当前Y坐标
    int getY() const {
        return y;
    }
    
    // 获取当前坐标
    void getCoordinates(int& out_x, int& out_y) const {
        out_x = x;
        out_y = y;
    }
    
    // 持续读取坐标（类似原程序的循环）
    void readContinuousCoordinates() {
        if (!is_open) {
            printf("device not opened\n");
            return;
        }
        
        while (true) {
            if (readEvent()) {
                printf("x:%d y:%d\n", x, y);
            }
        }
    }
    
    // 检查设备是否打开
    bool isOpen() const {
        return is_open;
    }
};

// 使用示例
int main() {
    TS touchscreen;
    
    if (touchscreen.openDevice()) {
        // 方法1：持续读取坐标（类似原程序）
        // touchscreen.readContinuousCoordinates();
        
        // 方法2：按需读取坐标
        for (int i = 0; i < 10; i++) {
            if (touchscreen.readEvent()) {
                int x, y;
                touchscreen.getCoordinates(x, y);
                printf("Coordinate %d: x:%d y:%d\n", i, x, y);
            }
            usleep(100000); // 延迟100ms
        }
        
        touchscreen.closeDevice();
    }
    
    return 0;
}